package cn.lystudio.rohmtimeopwide_background_v11.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.util.ObjectUtil;
import cn.lystudio.rohmtimeopwide_background_v11.entity.dto.AbHandleItemDTO;
import cn.lystudio.rohmtimeopwide_background_v11.entity.dto.SecDeptDTO;
import cn.lystudio.rohmtimeopwide_background_v11.entity.po.AbHandleItemPO;
import cn.lystudio.rohmtimeopwide_background_v11.mapper.AbHandleItemPOMapper;
import cn.lystudio.rohmtimeopwide_background_v11.service.AbHandleItemService;
import cn.lystudio.rohmtimeopwide_background_v11.service.DepartmentService;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;

@Slf4j
@Service
@DS("master")
public class AbHandleItemServiceImpl implements AbHandleItemService {
    @Resource
    private AbHandleItemPOMapper abHandleItemPOMapper;
    private DepartmentService secDeptService;

    @Autowired
    @Lazy
    public void setSecDeptService(DepartmentService secDeptService) {
        this.secDeptService = secDeptService;
    }

    @Override
    public List<AbHandleItemDTO> getAll(String keyword) {
        // 1.获取制造部门列表(已鉴权)
        List<SecDeptDTO> secDeptDTOList = secDeptService.getAll4SecDept();
        // 1.1 过滤secDept = true 的部门
        CollUtil.filter(secDeptDTOList, SecDeptDTO::getEnabled);
        // 1.2 组装secDeptID集合
        Set<Integer> secDeptIDList = new ConcurrentHashSet<>();
        CollUtil.forEach(secDeptDTOList.iterator(),(secDept,index)->{
            secDeptIDList.add(secDept.getSecDeptID());
        });
        if(CollUtil.isEmpty(secDeptDTOList)||CollUtil.isEmpty(secDeptDTOList)) return null;
        // 2. 获取异常处理项列表
        LambdaQueryWrapper<AbHandleItemPO> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(AbHandleItemPO::getSecDeptID,secDeptIDList);
        List<AbHandleItemPO> abHandleItemPOList = abHandleItemPOMapper.selectList(wrapper);
        // 3.组装view层数据
        List<AbHandleItemDTO> abHandleItemDTOList = CollUtil.list(false);
        CollUtil.forEach(abHandleItemPOList.iterator(),(abHandleItem,index)->{
            AbHandleItemDTO abHandleItemDTO = new AbHandleItemDTO();
            abHandleItemDTO.setAbHandleItem(abHandleItem);
            abHandleItemDTO.setSecDept(
                    CollUtil.findOne(secDeptDTOList, secDept -> {
                        return abHandleItem.getSecDeptID().equals(secDept.getSecDeptID());
                    })
            );
            abHandleItemDTOList.add(abHandleItemDTO);
        });
        // 4.过滤数据
        CollUtil.removeNull(abHandleItemDTOList);
        CollUtil.filter(abHandleItemDTOList,abHandleItem ->{
           return (ObjectUtil.isNotEmpty(abHandleItem.getSecDept()));
        });
        // 5.关键字检索
        CollUtil.filter(abHandleItemDTOList,abHandleItem ->{
            return abHandleItem.getAbHandleItem().getAbHandleItemName().contains(keyword);
        });
        return abHandleItemDTOList;
    }

    @Override
    public int uptAbHandleItemEnabled(Integer abHandleItemID, Boolean enabled) {
        AbHandleItemPO abHandleItemPO = new AbHandleItemPO();
        abHandleItemPO.setAbHandleItemID(abHandleItemID);
        abHandleItemPO.setEnabled(enabled);
        return abHandleItemPOMapper.updateById(abHandleItemPO);
    }

    @Override
    public int delAbHandleItem(Integer abHandleItemID) {
        return abHandleItemPOMapper.deleteById(abHandleItemID);
    }

    @Override
    public int addAbHandleItem(AbHandleItemPO abHandleItemPO) {
        return abHandleItemPOMapper.insert(abHandleItemPO);
    }

    @Override
    public int uptAbHandleItem(AbHandleItemPO abHandleItemPO) {
        return abHandleItemPOMapper.updateById(abHandleItemPO);
    }

    @Override
    public List<AbHandleItemPO> getAllOfSecDept(Integer secDeptID) {
        return abHandleItemPOMapper.selectList(new LambdaQueryWrapper<AbHandleItemPO>().eq(AbHandleItemPO::getSecDeptID,secDeptID));
    }
}
